package com.example.clothingmanager.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author Huangyt
 * @version 1.0
 * @date 2020/5/11 21:24
 */
@Configuration
public class ShiroConfig {
    //拦截器， 拦截到相关映射地址后跳转到登录页面
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        /**
         * Shiro内置过滤器， 实现相关权限相关的拦截器
         * 		常用的过滤器：
         * 			anon: 无需认证（登录）可以访问
         * 			authc: 必须认证才可以访问
         * 			user: 如果使用rememberMe的功能可以直接访问
         *  		perms: 该资源必须得到资源权限才可以访问
         *  		role: 该资源必须得到角色权限才可以访问
         */
        //一定要用 LinkedHashMap 否则出错
//        Map<String, String> filterMap = new LinkedHashMap<>();
//
//        //授权拦截器， 拦截后会调用 doGetAuthorizationInfo 方法进行授权逻辑
//        filterMap.put("/test/add", "perms[user:abc]");
//        filterMap.put("/test/update", "perms[user:add]");
//
//        //拦截类似 /test/add 的路径，跳转到登录页面
//        filterMap.put("/test/**", "authc");
//
//        //设置自定义登录认证页面
//        shiroFilterFactoryBean.setLoginUrl("/toLogin");
//        //设置自定义未授权页面
//        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorizedUrl");
//
//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);


        return shiroFilterFactoryBean;
    }


    @Bean("securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }


    @Bean("userRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }

    /**
     * 配置ShiroDialect， 用于thymeleaf和shiro标签配合使用
     */
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}
